package com.cyq.day08;

public class HomeWork01 {
    //封装一个方法，打印给定年，月的日历
    //tip：应该有三个方法：1，输入任意日期是星期几（1900.1.1是星期一）2，打印每月的日历3.打印每年的日历
    public static void main(String[] args) {
        //System.out.println(getWeek(2021,2,1));
        //MonthPrint(8, 2021);
        YearPrint(2021);
    }

    /**
     * 打印每月的日历
     */
    public static void MonthPrint(int month, int year) {
        //打印月的日历首先应该确定这个月的一号是星期几
        //调用getweek方法
        int firstday = getWeek(year, month, 1);
        //其次确定这个月有多少天
        int day = 0;
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
            day = 31;
        } else if (month == 4 || month == 6 || month == 9 || month == 11) {
            day = 30;
        } else if (month == 2) {
            if (isLeapYear(month)) {
                day = 29;
            } else {
                day = 28;
            }
        }
        //开始打印
        //打印日历表头
        System.out.println(year + "年" + month + "月");
        System.out.println("星期天\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
        System.out.println("-------------------------------------------------------");
        //先根据第一天是星期几进行空行并记录空行数
        int count = 0;
        for (int j = 0; j < firstday; j++) {
            System.out.print("\t\t");
            count++;
        }
        //剩下的天数依次打印
        int today = 1;
        for (int i = 1; i <= day; i++) {
            System.out.print(i + "\t\t");
            count++;
            if (count % 7 == 0) {
                System.out.println();
            }
        }
    }

    /**
     * 打印每年的日历
     */
    public static void YearPrint(int year) {
        //直接循环每月的打印方法即可
        for (int i = 0; i < 12; i++) {
            MonthPrint(i + 1, year);
            System.out.println();
        }
    }

    /**
     * 根据指定日期获取星期几的方法
     *
     * @param year  - 指定年
     * @param month - 指定月
     * @param day   - 指定日
     * @return 星期数，0代表星期日，其他数字代表对应的星期数
     */
    public static int getWeek(int year, int month, int day) {
        //循环输入的year的1月1号至1900年1月1号之间的年份，判断闰年
        //定义变量接收总天数
        int allDay = 0;
        for (int i = 1900; i < year; i++) {
            if (isLeapYear(i)) {
                allDay += 366;
            } else {
                allDay += 365;
            }
        }
        //需要加上year这一年的天数
        switch (month - 1) {
            case 11:
                allDay += 30;
            case 10:
                allDay += 31;
            case 9:
                allDay += 30;
            case 8:
                allDay += 31;
            case 7:
                allDay += 31;
            case 6:
                allDay += 30;
            case 5:
                allDay += 31;
            case 4:
                allDay += 30;
            case 3:
                allDay += 31;
            case 2:
                allDay += isLeapYear(year) ? 29 : 28;
            case 1:
                allDay += 31;
        }
        //返回计算出的所有天数与7求余的结果，结果只能是0-6，对应的是星期天到星期六
        return (allDay + day) % 7;
    }

    /**
     * 判断指定年份是否为闰年
     *
     * @param year
     * @return
     */
    public static boolean isLeapYear(int year) {
        return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    }
}
